js闭包

闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。

要理解闭包,首先必须理解Javascript特殊的变量作用域。变量的作用域无非就是两种:全局变量和局部变量。Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。

出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现, 这种方法就是闭包。

    function box() {
    var user = 'Lee';
    return function () { //通过匿名函数返回 box()局部变量
    return user;
    };
    }
    alert(box()()); //通过box()()来直接调用匿名函数返回值
    var b = box();
    alert(b()); 

闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。。

使用闭包有一个优点,也是它的缺点:就是可以把局部变量驻留在内存中,可以避免使用全局变量。(全局变量污染导致应用程序不可预测性,每个模块都可调用必将引来灾难,所以推荐使用私有的,封装的局部变量)

js闭包---var vs let

有一个比较有意思的事情就是 ES6推出的let congst之后引发的一场血案, ^_^这场血案需要格外注意

下面来看两段代码, 其中唯一的区别就是 for 循环中 i 变量的关键字前者为 var 后者为 let, 两者都是用了闭包的概念

    function box() {
      var arr = [];
      for (let i = 0; i < 5; i++) {
        arr[i] = function () {
        return i;
        };
      }
      return arr;
    }
    let b = box(); //得到函数数组
    for (let i = 0; i < b.length; i++) {
      console.log(b[i]()); //输出每个函数的值,都是最后一个值
    }
    //运行结果
    // 0
    // 1
    // 2
    // 3
    // 4
    function box() {
      let arr = [];
      for (let i = 0; i < 5; i++) {
        arr[i] = function () {
        return i;
        };
      }
      return arr;
    }
    let b = box(); //得到函数数组
    for (let i = 0; i < b.length; i++) {
      console.log(b[i]()); //输出每个函数的值,都是最后一个值
    }
    //运行结果
    // 0
    // 1
    // 2
    // 3
    // 4

这里设计了作用域的问题, 更涉及了 var 和 let 在 for 循环中条件表达式中的与其他高级语言的不同, 除了 var 不存在块级作用域 let 存在代码块作用域这一说不加详细介绍,最关键的是如果条件语句中用 let 则在每次循环的初期都会生成一个变量-(这与 c 语言, java 不同) ,而 var 只会在访问初期调用一次生成一个变量, 这个是js最新出现的闭包相关的易错点.


镰月
313 声望13 粉丝

它的优秀之处并非原创,它的原创之处并不优秀。